package com.liuxinlong.api;

import com.liuxinlong.modules.entity.FileManage;
import com.liuxinlong.modules.entity.User;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * SPO服务api
 *
 * @author liuxinlong@hotwater.com.cn
 * @version 1.0.0
 * @since 2022年6月27日
 */
public interface SPOInterface {
    /**
     * 连接spo服务器，获取请求字段
     *
     * @param user 用户信息
     * @return SPORequestHeaderDto
     */
    SPORequestHeaderDto connectSPO(User user);

    /**
     * 文件下载
     *
     * @param spo       连接参数
     * @param targetDir 目标文件夹
     * @param fileName  文件名称
     * @return 文件暂存路径
     */
    String downloadFile(SPORequestHeaderDto spo, String targetDir, String fileName);

    /**
     * 文件流上传
     *
     * @param spo              接参数
     * @param targetDir        目标文件夹
     * @param localInputStream 本地文件流
     * @param fileName         文件名称
     * @return 文件信息
     */
    FileManage uploadFileStream(SPORequestHeaderDto spo, String targetDir, InputStream localInputStream, String fileName);

    /**
     * 文件上传
     *
     * @param spo       连接参数
     * @param targetDir 目标文件夹
     * @param localPath 本地路径
     * @param fileName  文件名称
     * @return 文件信息
     */
    FileManage uploadFile(SPORequestHeaderDto spo, String targetDir, String localPath, String fileName);

    /**
     * 获取某一文件夹下全部文件列表
     *
     * @param spo 连接参数
     * @param dir 文件夹路径
     */
    List<FileManage> getDirFileList(SPORequestHeaderDto spo, String dir);

    /**
     * 文件检索
     *
     * @param spo      连接参数
     * @param keyword  查询关键字
     * @param startNum 起始数量
     * @param pageSize 单页记录数
     * @return 全文检索文件列表及总记录数
     */
    Map<String, Object> searchFilePost(SPORequestHeaderDto spo, String keyword, int startNum, int pageSize);

    /**
     * 文件检索
     *
     * @param spo 连接参数
     */
    void searchFileGet(SPORequestHeaderDto spo, String keyword);

    /**
     * 移动文件到目标地址
     *
     * @param spo        连接参数
     * @param originPath 原地址
     * @param targetPath 新地址
     */
    void moveFile(SPORequestHeaderDto spo, String originPath, String targetPath);

    /**
     * 文件检索
     *
     * @param spo        连接参数
     * @param spoFilePath spo文件地址
     */
    void removeFile(SPORequestHeaderDto spo, String spoFilePath);

}
